package main

/**
【1】函数：
对特定的功能进行提取，形成一个代码片段，这个代码片段就是我们所说的函数
【2】函数的作用：提高代码的复用性
【3】函数和函数是并列的关系，所以我们定义的函数不能写到main函数中
【4】基本语法
func   函数名（形参列表)（返回值类型列表）{
			执行语句..
			return + 返回值列表
}
（1）函数名：
遵循标识符命名规范:见名知意 addNum,驼峰命名addNum
首字母不能是数字
首字母大写该函数可以被本包文件和其它包文件使用(类似public)
首学母小写只能被本包文件使用，其它包文件不能使用(类似private)

（2）形参列表：
形参列表：个数：可以是一个参数，可以是n个参数，可以是0个参数
形式参数列表：作用：接收外来的数据
实际参数：实际传入的数据
*/
import "fmt"

// func   函数名（形参列表)（返回值类型列表）{
// 	执行语句..
// 	return + 返回值列表
// }
//自定义函数：功能：两个数相加：
//如果返回值类型就一个的话，那么()是可以省略不写的
//如果没有返回值类型的话，那么可以什么都不写
func cal(num1 int, num2 int) (int, error) {
	var sum int = 0
	sum += num1
	sum += num2
	return sum, nil
}
func main() {
	//功能：10 + 20
	//调用函数：(不想接收的返回值可以用 _ 进行忽略)
	sum, _ := cal(10, 20)
	fmt.Println(sum)
	// var num1 int = 10
	// var num2 int = 20
	//求和：
	// var sum int = 0
	// sum += num1
	// sum += num2
	// fmt.Println(sum)
	//功能：30 + 50
	var num3 int = 30
	var num4 int = 50
	//调用函数：
	sum1, _ := cal(num3, num4)
	fmt.Println(sum1)
	//求和：
	// var sum1 int = 0
	// sum1 += num3
	// sum1 += num4
	// fmt.Println(sum1)

	fmt.Println("-------------------- -------------------- --------------------")

	test()
	fmt.Println("--------------------")
	test(3)
	fmt.Println("--------------------")
	test(37, 58, 39, 59, 47)
}

// Golang中函数不支持重载!!!

//定义一个函数，函数的参数为：可变参数 ...  参数的数量可变
//args...int 可以传入任意多个数量的int类型的数据  传入0个，1个，，，，n个
func test(args ...int) {
	//函数内部处理可变参数的时候，将可变参数当做切片来处理
	//遍历可变参数：
	for i := 0; i < len(args); i++ {
		fmt.Println(args[i])
	}
}
